package com.jiajia.study.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * @author zjiajia
 * @date 2024/7/16 9:33
 */
@Configuration
public class MyWebConfigAdapter extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                /**
                 * 匹配到的路径允许所有用户访问，一般是公共资源
                 */
                .mvcMatchers("/login.html").permitAll()
                .mvcMatchers("/index").permitAll()
                /**
                 * 所有的资源需要进行认证，排除前面的公共资源
                 */
                .anyRequest().authenticated()
                /**
                 * and() 返回的仍然是 HttpSecurity 对象
                 */
                .and()
                /**
                 * 加上 formLogin 表单登录的方式，才会自动创建登录页面
                 */
                .formLogin()
                .loginPage("/login.html")
                .loginProcessingUrl("/doLogin")
                .usernameParameter("uname")
                .passwordParameter("passwd")
                /**
                 * 登录成功之后跳转路径：
                 *    redirect :
                 *      1. 地址会改变
                 *      2. 会记录之前的请求路径，如果有，就跳到之前的路径

                 *
                 */
//                .defaultSuccessUrl("/index")
                /**
                 * 登录成功之后，forward 的路径
                 * forward 的路径：
                 *      1. 地址栏不会变
                 *      2. 不会跳到未认证之前的路径，丢失认证前的请求路径
                 *
                 * 注意：这里的请求方式问题，doLogin 是 post 方式，
                 *      forward 也就成了 post 方式, /index 请求就是按照 post 方式的
                 */
//                .successForwardUrl("/index")
                /**
                 * 自定义成功认证处理器 ：
                 *      成功之后的处理逻辑
                 *
                 *  可以看一下 ：AuthenticationSuccessHandler 接口
                 *  forward 跳转 和 redirect 跳转 都是 AuthenticationSuccessHandler 的实现类
                 */
                .successHandler(new MyAuthenticationSuccessHandler())
                /**
                 * 自定义异常处理器 ：
                 *
                 */
                .failureHandler(new MyAuthenticationFailureHandler())
//                .failureUrl("/login.html")
                .and()
                /**
                 * 退出登录配置
                 */
                .logout()
                /**
                 * 退出登录请求路径
                 */
                .logoutUrl("/logout")
                /**
                 * 成功退出登录跳转路径
                 */
//                .logoutSuccessUrl("/login.html")
                .logoutSuccessHandler(new MyLogoutSuccessHandler())
                /**
                 * 清楚 httpSession
                 */
                .invalidateHttpSession(true)
                /**
                 * 清楚 Authentication 信息
                 */
                .clearAuthentication(true)
                .and().csrf().disable()
                ;

    }
}
